﻿// 167. 木棒  jinjiezhinan.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <algorithm>
#include <memory.h>

using namespace std;
/*

https://www.acwing.com/problem/content/169/
乔治拿来一组等长的木棒，将它们随机地砍断，使得每一节木棍的长度都不超过 50 个长度单位。

然后他又想把这些木棍恢复到为裁截前的状态，但忘记了初始时有多少木棒以及木棒的初始长度。

请你设计一个程序，帮助乔治计算木棒的可能最小长度。

每一节木棍的长度都用大于零的整数表示。

输入格式
输入包含多组数据，每组数据包括两行。

第一行是一个不超过 64 的整数，表示砍断之后共有多少节木棍。

第二行是截断以后，所得到的各节木棍的长度。

在最后一组数据之后，是一个零。

输出格式
为每组数据，分别输出原始木棒的可能最小长度，每组数据占一行。

数据范围
数据保证每一节木棍的长度均不大于 50。

输入样例：
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
输出样例：
6
5
*/




const int N = 64;
int sticks[N];
bool st[N];
int n, sum, length;

bool dfs(int u, int cur, int start) {
	if (u * length == sum) return true;

	if (cur == length) { return dfs(u + 1, 0, 0); }

	for (int i = 0; i < n; i++) {
		if (st[i]) continue;
		int l = sticks[i];
		if (l + cur > length) continue;
		st[i] = true;
		if (dfs(u, cur + l, i + 1)) return true;
		st[i] = false;
		if (!cur) return false;
		if (cur + l == length) return false;
		int j = i;
		while (j < n && sticks[j] == l)  j++;
		i = j - 1;
	}
	return false;
}

int main() {
	while (cin >> n, n) {
		sum = 0; length = 0;
		for (int i = 0; i < n; i++) {
			int l; cin >> l;
			sticks[i] = l;

			if (l > 50) continue;
			sum += l;
			length = max(length, l);
		}
		sort(sticks, sticks + n);
		reverse(sticks, sticks + n);
		memset(st, false, sizeof st);
		for (int i = 0; i < n; i++) {
			if (sticks[i] > 50) {
				st[i] = true;
			}
		}

		while (length) {
			if (sum % length == 0 && dfs(0, 0, 0)) {
				cout << length << endl;
				break;
			}
			length++;
		}


	}


	return 0;
}